package com.example.order.config;

import com.alibaba.fastjson.JSONObject;
import com.example.order.entity.TimeOutLog;
import com.example.order.mapper.TimeOutLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 超时接口监听 记录到数据库
 */
@Slf4j
@Aspect
@Component
public class TimedOutListen {

        @Autowired
        private TimeOutLogMapper timeOutLogMapper;

        /**
         * 环绕通知 监听controller里面的接口超时
         * @param proceedingJoinPoint
         * @return
         * @throws Throwable
         */
        @Around("execution(* com.example.order.controller.*.*(..))")
        public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
            //返回结果
            Object result = null;
            //开始时间
            long startTime = System.currentTimeMillis();
            try {
                //执行方法
                result = proceedingJoinPoint.proceed();
                return result;
            } catch (Throwable throwable) {
                throw throwable;
            } finally {
                //结束时间
                long endTime = System.currentTimeMillis();
                //如果大于3000毫秒那么就说明超时了
                if (endTime - startTime > 3000L) {
                    //方法的名字
                    String method=proceedingJoinPoint.getSignature().toShortString();
                    //超时时间 毫秒
                    long time=endTime-startTime;
                    //请求参数
                    String str= JSONObject.toJSONString(proceedingJoinPoint.getArgs());
                    log.info("请求方法:{},超时时间:{},请求参数:{}",method,time,str);
                    //把超时日志 记录到数据库中
                    TimeOutLog bean=new TimeOutLog();
                    bean.setTime(time);
                    bean.setCreateTime(new Date());
                    bean.setRequestMethod(method);
                    bean.setRequestParams(str);
                    timeOutLogMapper.insert(bean);
                    //TODO 这时候 也可以设置发送短信 或者邮件的功能 通知程序员 去解决这个超时的问题

                }
            }
        }




}
